package TCPFile;

import java.net.*;
import java.io.*;

public class TCPClient {
    /*
     Socket _socket;
     InputStream _i;
     OutputStream _o;
    
     public TCPClient(Socket s) throws IOException {
     _socket = s;
     _i = _socket.getInputStream();
     _o = _socket.getOutputStream();
     }
     */

    public static void sendFile(File f, String serv, int port) throws Exception {
        if (f.exists()) {
            System.out.println("Envoi du fichier " + f.getAbsolutePath());
            Socket s = new Socket(serv, port);

            OutputStream fluxsortie = s.getOutputStream();
            InputStream in = new BufferedInputStream(new FileInputStream(f));

            ByteArrayOutputStream tableaubytes = new ByteArrayOutputStream();
            BufferedOutputStream tampon = new BufferedOutputStream(tableaubytes);

            long taillefichier = f.length();
            long nbpassagesuposé = taillefichier / 4096;
            System.out.println("Passages supposés : " + nbpassagesuposé);

            int lu = in.read();
            int[] aecrire = new int[4096];
            int compteur = 0;
            long ouonestrendu = 0;

            //Tant qu'on est pas à la fin fu chier 
            while (lu > -1) {

                //On lit les données du fichier 
                aecrire[compteur] = lu;
                lu = in.read();
                compteur++;

                //Quand on a rempli le tableau, on envoie un paquet de 4096 octets 
                if (compteur == 4096) {
                    compteur = 0;
                    ouonestrendu++;
                    //On remplit le tampon 
                    for (int x = 0; x < 4096; x++) {
                        tampon.write(aecrire[x]);
                    }

                    //Et on l'envoie 
                    fluxsortie.write(tableaubytes.toByteArray());

                    tableaubytes.reset();
                    System.out.println("Avancement : " + (float) ouonestrendu / nbpassagesuposé * 100 + "%");
                }
            }

            //On envoie le dernier paquet, qui ne fait pas forcément 4096 octets 
            //On remplit le tampon 
            for (int x = 0; x < 4096; x++) {
                tampon.write(aecrire[x]);
            }

            //Et on l'envoie 
            tampon.flush();
            fluxsortie.write(tableaubytes.toByteArray());
            fluxsortie.flush();

            System.out.println("Avancement: " + (float) ouonestrendu / nbpassagesuposé * 100 + "%");

            System.out.println("Youpi finished");
            in.close();
            tampon.close();
            System.out.println("Passages effectués : " + ouonestrendu);
            s.close();
        } else {
            System.out.println("Le fichier " + f + " est introuvable");
        }

    }
}
